home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 38
/
Amiga Format CD38 (1999-03-15)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-04].iso
/
-websites-
/
haage&partner
/
ftp
/
warpup
/
warpup_release2.lha
/
WarpUP-WarpOS
/
Docs
/
powerpc.doc
Wrap
Text File
|
1997-10-21
|
97KB
|
3,339 lines
TABLE OF CONTENTS
powerpc.library/AllocVec32
powerpc.library/AllocXMsg
powerpc.library/FreeVec32
powerpc.library/FreeXMsg
powerpc.library/GetCPU
powerpc.library/GetPPCState
powerpc.library/PowerDebugMode
powerpc.library/PutXMsg
powerpc.library/RunPPC
powerpc.library/SPrintF68K
powerpc.library/WaitForPPC
powerpc.library/AddHeadPPC
powerpc.library/AddPortPPC
powerpc.library/AddSemaphorePPC
powerpc.library/AddTailPPC
powerpc.library/AddTimePPC
powerpc.library/AllocSignalPPC
powerpc.library/AllocVecPPC
powerpc.library/AllocXMsgPPC
powerpc.library/AttemptSemaphorePPC
powerpc.library/ChangeMMU
powerpc.library/ClearExcMMU
powerpc.library/CmpTimePPC
powerpc.library/CopyMemPPC
powerpc.library/CreateMsgPortPPC
powerpc.library/CreateTaskPPC
powerpc.library/DeleteMsgPortPPC
powerpc.library/DeleteTaskPPC
powerpc.library/EndSnoopTask
powerpc.library/EnqueuePPC
powerpc.library/FindNamePPC
powerpc.library/FindPortPPC
powerpc.library/FindSemaphorePPC
powerpc.library/FindTagItemPPC
powerpc.library/FindTaskPPC
powerpc.library/FreeAllMem
powerpc.library/FreeSemaphorePPC
powerpc.library/FreeSignalPPC
powerpc.library/FreeVecPPC
powerpc.library/FreeXMsgPPC
powerpc.library/GetInfo
powerpc.library/GetMsgPPC
powerpc.library/GetSysTimePPC
powerpc.library/GetTagDataPPC
powerpc.library/InitSemaphorePPC
powerpc.library/InsertPPC
powerpc.library/LockTaskList
powerpc.library/ModifyFPExc
powerpc.library/NextTagItemPPC
powerpc.library/ObtainSemaphorePPC
powerpc.library/PutMsgPPC
powerpc.library/PutXMsgPPC
powerpc.library/ReleaseSemaphorePPC
powerpc.library/RemExcHandler
powerpc.library/RemHeadPPC
powerpc.library/RemovePPC
powerpc.library/RemPortPPC
powerpc.library/RemTailPPC
powerpc.library/RemSemaphorePPC
powerpc.library/ReplyMsgPPC
powerpc.library/Run68K
powerpc.library/SetCache
powerpc.library/SetExcHandler
powerpc.library/SetExcMMU
powerpc.library/SetHardware
powerpc.library/SetReplyPortPPC
powerpc.library/SetSignalPPC
powerpc.library/SetTaskPriPPC
powerpc.library/Signal68K
powerpc.library/SignalPPC
powerpc.library/SnoopTask
powerpc.library/SPrintF
powerpc.library/SubTimePPC
powerpc.library/Super
powerpc.library/UnLockTaskList
powerpc.library/User
powerpc.library/WaitFor68K
powerpc.library/WaitPortPPC
powerpc.library/WaitPPC
powerpc.library/WaitTime
powerpc.library/AllocVec32 powerpc.library/AllocVec32
NAME
AllocVec32 - allocates memory which is correctly aligned (V7)
CPU
680x0
SYNOPSIS
memblock = AllocVec32(memsize, attributes)
d0 d0 d1
void *AllocVec32(ULONG, ULONG);
FUNCTION
This function allocates memory via exec/AllocVec and aligns the
memory block properly, so that this memory block can be shared
with PPC tasks. The minimal alignment of the memory block is 32.
INPUTS
memsize - size of memory to be allocated
attributes - the desired memory attributes (see exec/AllocMem for
a description of these attributes)
RESULT
memblock - The address of the allocated memory block
NOTES
Memory blocks allocated with 'AllocVec32' must be freed using
'FreeVec32'.
SEE ALSO
FreeVec32, exec/AllocMem
powerpc.library/AllocXMsg powerpc.library/AllocXMsg
NAME
AllocXMsg - allocates a message for Inter-CPU communication (V12)
CPU
680x0
SYNOPSIS
message = AllocXMsg(bodysize, replyport)
d0 d0 a0
struct Message *AllocXMsg(ULONG, struct MsgPort *);
FUNCTION
This function allocates memory for a message which can be used
for Inter-CPU communication. Some fields of the message are
initialized.
After this function was called, the message body must be
created before sending this message.
INPUTS
bodysize - the size of the message body (max. 65535-MN_SIZE)
replyport - the reply port
RESULT
message - The address of an initialized message (except for
the message body, which must be initialized by the
programmer).
NOTES
Calling this function is the only way allowed to create a
message which can be sent to a PPC task.
A message allocated with 'AllocXMsg' should be freed using
'FreeXMsg' if it is not used anymore.
An Inter-CPU message must be sent with 'PutXMsg' to a PPC
task.
A replyport should always be specified. Inter-CPU messages
should always be replied and the reply should be read.
It is possible not to specify a replyport (simply set
replyport to NULL). But don't forget that the message
must NOT be freed by a PPC task!
SEE ALSO
FreeXMsg, PutXMsg
powerpc.library/FreeVec32 powerpc.library/FreeVec32
NAME
FreeVec32 - frees memory allocated with 'AllocVec32' (V7)
CPU
680x0
SYNOPSIS
FreeVec32(memblock)
a1
void FreeVec32(void *);
FUNCTION
This function frees a memory block which was allocated using
'AllocVec32'.
INPUTS
memblock - The address of the allocated memory block
SEE ALSO
AllocVec32
powerpc.library/FreeXMsg powerpc.library/FreeXMsg
NAME
FreeXMsg - frees a message allocated with 'AllocXMsg' (V12)
CPU
680x0
SYNOPSIS
FreeXMsg(message)
a1
void FreeXMsg(struct Message *);
FUNCTION
This function frees a memory allocated using 'AllocXMsg'.
INPUTS
message - a message allocated by 'AllocXMsg'.
NOTES
[An Inter-CPU message must not be freed, if it was sent to
a PPC task and the reply has not yet arrived back.]
The above statement is not valid anymore. Inter-CPU-Messages
can be freed by another PPC task even if it wasn't replied.
SEE ALSO
AllocXMsg, PutXMsg
powerpc.library/GetCPU powerpc.library/GetCPU
NAME
GetCPU - gets the PowerPC CPU type (V7)
CPU
680x0
SYNOPSIS
CPUType = GetCPU
d0
ULONG GetCPU (void);
FUNCTION
This function reads the PowerPC CPU type. A longword is returned with
one specific bit set (see the include file 'powerpc/powerpc.i' for a
description of the different CPU types)
RESULT
CPUType - A longword with one specific bit set.
powerpc.library/GetPPCState powerpc.library/GetPPCState
NAME
GetPPCState - returns the state of the PPC and PPC applications (V13)
CPU
680x0
SYNOPSIS
PPCState = GetPPCState
d0
ULONG GetPPCState (void);
FUNCTION
This function returns the current state of the PPC processor and
the state of custom applications. A bitmask is returned with the
values defined in 'powerpc.i'.
RESULT
PPCState - A bitmask. The following bits are supported (the
description is valid if the bit is 1):
PPCSTATEF_POWERSAVE - PPC is currently in power save mode.
PPCSTATEF_APPACTIVE - PPC application tasks are currently
- active resp. installed in the system.
PPCSTATEF_APPRUNNING - At least one PPC application task is
ready or running.
powerpc.library/PowerDebugMode powerpc.library/PowerDebugMode
NAME
PowerDebugMode - sets the level of debugging output (V7)
CPU
680x0
SYNOPSIS
PowerDebugMode (debuglevel)
d0
void PowerDebugMode (ULONG);
FUNCTION
The powerpc.library has a built-in debugging system which prints out
many informations to the serial port. The main purpose of this
function is to improve the maintenance of this library. If problems
occur with the powerpc.library then it will help the author of this
library a lot to fix the problems. Try to reproduce the problems with
debugging output enabled and send the debugging output to the author.
Use a program which captures the data transferred to the serial port
(for example Sushi) to save the debugging output.
INPUTS
debuglevel - Debugging level (0-3). All other values are ignored.
The higher the debugging level, the larger the debugging
output. 0 means no debugging output.
NOTES
The powerpc.library operates with debugging level 0 by default (no
debugging output). You can change the default value with the
environment variable 'powerpc/debug' (set values from 0 to 3).
powerpc.library/PutXMsg powerpc.library/PutXMsg
NAME
PutXMsg - sends an Inter-CPU message to a PPC task (V12)
CPU
680x0
SYNOPSIS
PutXMsg(MsgPortPPC, message)
a0 a1
void PutXMsg(struct MsgPortPPC *, struct Message *);
FUNCTION
This function sends an Inter-CPU message allocated by 'AllocXMsg'
to a PPC task.
INPUTS
MsgPortPPC - a PPC message port
message - a message allocated by 'AllocXMsg'.
NOTES
Inter-CPU must NOT be used for internal communication. They can
only be used for communication between tasks on different processors.
Inter-CPU messages get a different node type, if they are
sent. If you want to filter out Reply-Messages from standard
or Inter-CPU messages, compare the LN_TYPE field to NT_REPLYMSG.
Replied Inter-CPU messages still get the same node type
(NT_REPLYMSG). Any assumptions about the value of the new
node type are ILLEGAL!!
As soon as an Inter-CPU message is sent, the 68K looses ownership
over the message. No access to the message is allowed until the
reply has been arrived.
Inter-CPU messages can be reused if they have been replied.
Inter-CPU messages are read and replied using the standard
message handling mechanisms (exec/WaitPort,exec/GetMsg,exec/ReplyMsg
for 68K, powerpc/WaitPortPPC, powerpc/GetMsgPPC, powerpc/ReplyMsgPPC
for PPC).
Don't call exec/ReplyMsg with an InterCPU-Message without
Replyport (versions less than V12.2 crashed).
The receiving task must NOT access message data, which are not
explicitely located in the message body (for example data which is
referenced by a pointer) unless both tasks care for the cache
consistency. Only the message itself is flushed/invalidated
automatically by the system.
The receiving task may write to the message body of an Inter-CPU
message.
Inter-CPU messages should always be replied and the reply should
be read and filtered out.
SEE ALSO
AllocXMsg, FreeXMsg
powerpc.library/RunPPC powerpc.library/RunPPC
NAME
RunPPC - runs a PowerPC function (V7)
CPU
680x0
SYNOPSIS
status = RunPPC(PPStruct)
d0 a0
LONG RunPPC (struct PowerPC *);
FUNCTION
Runs a PowerPC function. A mirror PPC process is created. All
registers can be transferred to PPC as well as parameters on
stack. All cache management actions are handled automatically.
All registers are transferred back from PPC after the PPC call
is completed. They are stored in the PowerPC structure.
The register assignment is as follows:
d0 <-> r3 fp0 <-> f1
d1 <-> r4 fp1 <-> f2
d2 <-> r22 fp2 <-> f3
d3 <-> r23 fp3 <-> f4
d4 <-> r24 fp4 <-> f5
d5 <-> r25 fp5 <-> f6
d6 <-> r26 fp6 <-> f7
d7 <-> r27 fp7 <-> f8
a0 <-> r5
a1 <-> r6
a2 <-> r28
a3 <-> r29
a4 <-> r2
a5 <-> r30
a6 <-> r31
Please note, that these registers are NOT transferred directly but
in the register array mentioned above (PP_REGS).
Here follows another table from the PPC's point of view:
PPC-Register: Index into the register array:
---------------------------------------------------------------
Base register:
r2 12
Scratch registers:
r3 0
r4 1
r5 8
r6 9
Nonvolatile registers:
r22 2
r23 3
r24 4
r25 5
r26 6
r27 7
r28 10
r29 11
r30 13
r31 14
INPUTS
PPStruct - Pointer to an initialized PowerPC Structure
PP_CODE : Pointer to the PowerPC code
PP_OFFSET : Not used until V12.2 of powerpc.library. From
V12.3 on, the PP_OFFSET field is used just like
at Run68K. If PP_OFFSET is zero, than the code
pointed to by PP_CODE is executed, if PP_OFFSET
is not zero, a PPC library function is executed
with PP_CODE containing the library base and
PP_OFFSET containing the library vector offset.
PP_FLAGS : Flags which can be ore'd together
- PP[F/B]_ASYNC : Call PPC function asynchronely (68K process
returns immediately)
PP_STACKPTR : Pointer to the arguments on the stack to be
transferred. The pointer must point directly
to the first argument, not to the return address!
If no arguments on stack should be transferred,
set this to zero.
PP_STACKSIZE : Size of the stack area to be transferred. If no
stack parameters should be transferred, set this
to zero.
PP_REGS : Array of longwords where the registers to be
transferred can be stored (d0-a6). Please see
above for the exact placement of these registers.
PP_FREGS : Array of quadwords (8 bytes) where the FP-registers
to be transferred can be stored (fp0-fp7). fp0 is
at offset 0, fp1 at offset 8 etc.
RESULT
status - PPERR_SUCCESS if the call was successfully
PPERR_ASYNCERR if a synchrone PPC call was made after an
asynchrone PPC call
NOTES
Calling a PPC function asynchronely is dangerous. Take care of
possible cache conflicts. Avoid calling system functions as much
as possible.
If an asynchrone PPC call is done, the function WaitForPPC MUST be
called ONCE after the call was done. No other PPC call is allowed
for this 68K process after an asynchrone PPC call and before a call
to WaitForPPC.
If an asynchronely called PPC function performs a 68K call, the call
is only performed when WaitForPPC is called by the 68K process. Note
that the PPC mirror process is still connected to the calling 68K
process.
DON'T pass arguments on stack when calling a PPC function asynchronely.
The stack is most likely to be trashed before it is copied to the PPC
stack.
Assembler programmers should use the macros RUNPOWERPC and
RUNPOWERPC_XL located in the include file 'powerpc/powerpc.i'
SEE ALSO
WaitForPPC,powerpc/powerpc.i
powerpc.library/SPrintF68K powerpc.library/SPrintF68K
NAME
SPrintF68K - prints a formatted string to the serial port (V7)
CPU
680x0
SYNOPSIS
SPrintF68K (Formatstring, values )
a0 a1
void SPrintF68K (STRPTR, APTR);
FUNCTION
Prints a formatted string to the serial port using the AMIGA-OS
functions 'exec/RawPutChar' and 'exec/RawDoFmt'. Can be used to add
debugging features and to improve the maintenance of software.
INPUTS
Formatstring - A C style string with % commands to indicate where
parameters have to be inserted (see 'exec/RawDoFmt'
for a detailed description of these commands).
values - A pointer to an array of parameters to be inserted into
specified places in the string.
SEE ALSO
exec/RawDoFmt
powerpc.library/WaitForPPC powerpc.library/WaitForPPC
NAME
WaitForPPC - waits for the completion of an asynchrone PPC call (V7)
CPU
680x0
SYNOPSIS
status = WaitForPPC(PPStruct)
d0 a0
LONG WaitForPPC (struct PowerPC *);
FUNCTION
After an asynchrone PPC call was done (see RunPPC) this function must
be called to wait for the completion of the PowerPC function. All
registers transferred to the PowerPC with RunPPC are returned into the
PowerPC Structure.
INPUTS
PPStruct - Pointer to a PowerPC Structure (see RunPPC for a description
of the elements). The structure has not to be initialized.
The structure must be transferred to hold the returned
registers by the PPC function.
RESULT
status - PPERR_SUCCESS if the call was successfully
PPERR_WAITERR if WaitForPPC is called after a synchrone PPC
call.
NOTES
Assembler programmers should use the macros WAITFORPPC and
WAITFORPPC_XL located in the include file 'powerpc/powerpc.i'
SEE ALSO
RunPPC,powerpc/powerpc.i
powerpc.library/AddHeadPPC powerpc.library/AddHeadPPC
NAME
AddHeadPPC - insert a node at the head of a list (V8)
CPU
PowerPC
SYNOPSIS
AddHeadPPC(_PowerPCBase, list, node)
r3 r4 r5
void AddHeadPPC(struct Library *, struct List*, struct Node*);
FUNCTION
Insert a node to the head of a standard exec list. This is the
mirror function of exec/AddHead.
INPUTS
_PowerPCBase - base of powerpc.library (can be omitted)
list - a pointer to the target list
node - the node to insert
NOTES
This function is guaranteed to work correctly, if the PowerPCBase
is not passed in r3.
Assembler programmers may use the macro _ADDHEAD located in
'powerpc/listsPPC.i'
This function is safe to call from exception handlers.
SEE ALSO
InsertPPC, AddTailPPC, RemovePPC, RemHeadPPC, RemTailPPC,
EnqueuePPC, FindNamePPC, powerpc/listsPPC.i
powerpc.library/AddPortPPC powerpc.library/AddPortPPC
NAME
AddPortPPC - adds a public PPC message port to the system (V11)
CPU
PowerPC
SYNOPSIS
AddPortPPC(_PowerPCBase, MsgPortPPC)
r3 r4
void AddPortPPC(struct Library *, struct MsgPortPPC *);
FUNCTION
This function adds a PPC message port to a public list of ports.
The message port should be named and the priority field should
be set. A public message port can be found by name using
'FindPortPPC'. This is the mirror function of exec/AddPort.
INPUTS
_PowerPCBase - base of powerpc.library
MsgPortPPC - pointer to a PPC message port. It's safe to pass a
NULL parameter.
SEE ALSO
CreateMsgPortPPC,DeleteMsgPortPPC,FindPortPPC,RemPortPPC
powerpc/portsPPC.i
powerpc.library/AddSemaphorePPC powerpc.library/AddSemaphorePPC
NAME
AddSemaphorePPC - initializes a global signal semaphore (V8)
CPU
PowerPC
SYNOPSIS
status = AddSemaphorePPC(_PowerPCBase, SignalSemaphorePPC)
r3 r3 r4
LONG AddSemaphorePPC(struct Library *, struct SignalSemaphorePPC *);
FUNCTION
Initializes a signal semaphore and adds it to the public semaphore
list. This is the mirror function of exec/AddSemaphore.
INPUTS
_PowerPCBase - base of powerpc.library
SignalSemaphorePPC - pointer to a signalsemaphorePPC structure
(a semaphore name should be specified)
RESULT
status - status value:
SSPPC_SUCCESS: function was successful
SSPPC_NOMEM: function failed due to lack of memory
SEE ALSO
InitSemaphorePPC, FreeSemaphorePPC, ObtainSemaphorePPC,
AttemptSemaphorePPC, ReleaseSemaphorePPC, RemSemaphorePPC,
FindSemaphorePPC, powerpc/semaphoresPPC.i
powerpc.library/AddTailPPC powerpc.library/AddTailPPC
NAME
AddTailPPC - insert a node at the tail of a list (V8)
CPU
PowerPC
SYNOPSIS
AddTailPPC(_PowerPCBase, list, node)
r3 r4 r5
void AddTailPPC(struct Library *, struct List*, struct Node*);
FUNCTION
Insert a node to the tail of a standard exec list. This is the
mirror function of exec/AddTail.
INPUTS
_PowerPCBase - base of powerpc.library (can be omitted)
list - a pointer to the target list
node - the node to insert
NOTES
This function is guaranteed to work correctly, if the PowerPCBase
is not passed in r3.
Assembler programmers may use the macro _ADDTAIL located in
'powerpc/listsPPC.i'
This function is safe to call from exception handlers.
SEE ALSO
InsertPPC, AddHeadPPC, RemovePPC, RemHeadPPC, RemTailPPC,
EnqueuePPC, FindNamePPC, powerpc/listsPPC.i
powerpc.library/AddTimePPC powerpc.library/AddTimePPC
NAME
AddTimePPC - adds one time request to another (V7)
CPU
PowerPC
SYNOPSIS
AddTimePPC(_PowerPCBase, Dest, Source)
r3 r4 r5
void AddTimePPC(struct Library *, struct timeval *, struct timeval *);
FUNCTION
This routine adds one timeval structure to another. The results are
stored in the destination (Dest + Source -> Dest)
This is the mirror function of timer/AddTime.
INPUTS
_PowerPCBase - base of powerpc.library
Dest - pointer to a timeval structure
Source - pointer to a timeval structure
NOTES
This function is safe to call from exception handlers
SEE ALSO
GetSysTimePPC, SubTimePPC, CmpTimePPC
powerpc.library/AllocSignalPPC powerpc.library/AllocSignalPPC
NAME
AllocSignalPPC - allocate a signal (V8)
CPU
PowerPC
SYNOPSIS
signalnum = AllocSignalPPC(_PowerPCBase, signalNum)
r3 r3 r4
LONG AllocSignalPPC(struct Library *, LONG);
FUNCTION
Allocate a signal bit from the current task's pool. Either a
particular bit or the next free bit may be allocated. This
is the mirror function of exec/AllocSignal.
INPUTS
_PowerPCBase - base of powerpc.library
signalNum - the desired signal bit number (0..31) or -1
if the next free bit should be allocated
RESULT
signalnum - the signal bit allocated or -1 for failure.
NOTES
IMPORTANT: The signal bit numbers are returned in the
68K notation! For example, if the number 27 is returned,
the waiting mask must be $08000000.
All signal allocations are kept coherent on both CPU's.
A signal allocated on the 68K side is not free anymore
for the mirror PPC task and vice versa. The PPC also
can wait for signals or send signals allocated on the
68K side and vice versa (V11).
SEE ALSO
FreeSignalPPC, SetSignalPPC, SignalPPC, WaitPPC
powerpc.library/AllocVecPPC powerpc.library/AllocVecPPC
NAME
AllocVecPPC - allocates memory for PPC with MMU support (V7)
CPU
PowerPC
SYNOPSIS
memblock = AllocVecPPC(_PowerPCBase, memsize, attributes, alignment)
r3 r3 r4 r5 r6
void *AllocVecPPC(struct Library *, ULONG, ULONG, ULONG);
FUNCTION
This function allocates memory which is correctly aligned for the use
by PowerPC applications. It's the mirror function of exec/AllocVec
but offers some additional features.
AllocVecPPC supports user defined alignment and allocation of memory-
blocks with a desired cache mode (MMU support only for V9+)
Since V12, it's possible to allocate memory, which is protected
against other tasks (either full- or write-protected).
INPUTS
_PowerPCBase - base of powerpc.library
memsize - the amount of memory to be allocated.
attributes - the requirements as explained in exec/AllocMem
This function offers some additional attributes:
MEMF_WRITETHROUGH: maps the allocated memory as writethrough
MEMF_COPYBACK: maps the allocated memory as copyback
MEMF_CACHEON: maps the allocated memory as cachable
MEMF_CACHEOFF: maps the allocated memory as noncachable
MEMF_GUARDED: maps the allocated memory as guarded
MEMF_NOTGUARDED: maps the allocated memory as not guarded
MEMF_BAT: puts the allocated memory block into a
BAT register
MEMF_PROTECT: the memory block should be full-protected
against other tasks (no user-accesses of
other tasks allowed).
MEMF_WRITEPROTECT: the memory block should be write-protected
against other tasks (no user-write-acesses
of other tasks allowed).
alignment - the desired alignment of the memory block. The system
may round this value up to a minimal alignment. It's
safe to pass 0 as alignment.
RESULT
memblock - The address of the allocated memory. If the
memory couldn't be allocated 0 is returned.
NOTES
The amount of memory effectively allocated is usually bigger
than the given memsize. It's not a good idea to call this
function many times to allocate very small pieces of memory.
If some of the additional memflags are specified, the alignment
and the size is internally rounded up to meet the requirements
of the MMU.
The additional MMU memflags are intended for highly optimizing
code and shoud not be used by standard applications.
The memflag MEMF_BAT can improve the performance of the memory
accesses heavily (especially on CPU's with software tablesearch).
But DON'T use this flag unless you really need the speed. Note:
The required free memory has to be much bigger than the size of
the memory to be allocated, because there are severe alignment
restrictions when using BAT registers.
The memflag MEMF_BAT has no effect if the task runs with BAT MMU
Setup.
Note that no other tasks should access memory which was allocated
using special MMU memflags, because the other task can probably
run under a different MMU setup which can cause cache problems,
if the other one writes to the same memory in copyback mode
while this task accesses the data in noncachable mode, for
example.
The MMU support ist not implemented in powerpc.library <= V9.
The memory protection support ist not implemented in
powerpc.library <= V11.
SEE ALSO
FreeVecPPC, FreeAllMem, powerpc/memoryPPC.i
powerpc.library/AllocXMsgPPC powerpc.library/AllocXMsgPPC
NAME
AllocXMsgPPC - allocates a message for Inter-CPU communication (V12)
CPU
PowerPC
SYNOPSIS
message = AllocXMsgPPC(_PowerPCBase, bodysize, replyport)
r3 r3 r4 r5
struct Message *AllocXMsgPPC(struct Library *, ULONG, struct MsgPort *);
FUNCTION
This function allocates memory for a message which can be used
for Inter-CPU communication. Some fields of the message are
initialized.
After this function was called, the message body must be
created before sending this message.
INPUTS
_PowerPCBase - base of powerpc.library
bodysize - the size of the message body (max. 65535-MN_SIZE)
replyport - the reply port
RESULT
message - The address of an initialized message (except for
the message body, which must be initialized by the
programmer).
NOTES
Calling this function is the only way allowed to create a
message which can be sent to a 68K task.
A message allocated with 'AllocXMsgPPC' should be freed using
'FreeXMsgPPC' if it is not used anymore.
An Inter-CPU message must be sent with 'PutXMsgPPC' to a 68K
task.
A replyport should always be specified. Inter-CPU messages
should always be replied and the reply should be read.
It is possible not to specify a replyport (simply set
replyport to NULL). But don't forget that the message
must NOT be freed by a 68K task!
SEE ALSO
FreeXMsgPPC, PutXMsgPPC
powerpc.library/AttemptSemaphorePPC powerpc.library/AttemptSemaphorePPC
NAME
AttemptSemaphorePPC - try to obtain without blocking (V8)
CPU
PowerPC
SYNOPSIS
status = AttemptSemaphorePPC(_PowerPCBase, SignalSemaphorePPC)
r3 r4
LONG AttemptSemaphorePPC(struct Library *,
struct SignalSemaphorePPC *);
FUNCTION
Tries to get exclusive access to a signal semaphore. If the semaphore
is locked by another task, this function returns with an appropriate
status value. This is the mirror function of exec/AttemptSemaphore
INPUTS
_PowerPCBase - base of powerpc.library
SignalSemaphorePPC - pointer to a signalsemaphorePPC structure
RESULT
status - status value:
ATTEMPT_SUCCESS: operation successful
ATTEMPT_FAILURE: semaphore couldn't be locked
NOTES
This call is guaranteed to preserve all GPR (except r0 and r3)
and the CTR.
SEE ALSO
InitSemaphorePPC, FreeSemaphorePPC, ObtainSemaphorePPC,
ReleaseSemaphorePPC, AddSemaphorePPC, RemSemaphorePPC
FindSemaphorePPC, powerpc/semaphoresPPC.i
powerpc.library/ChangeMMU powerpc.library/ChangeMMU
NAME
ChangeMMU - changes the MMU setup of the current task (V10)
CPU
PowerPC
SYNOPSIS
ChangeMMU(_PowerPCBase, MMUMode)
r3 r4
void ChangeMMU(struct Library *, ULONG);
FUNCTION
Changes the MMU setup of the currently running task. A task is able
to run with two different MMU setups:
- paged MMU setup: The standard method, where almost every memory
access is controlled by the page table
- BAT MMU setup: Almost all the memory is controlled by the 4 BAT
registers.
INPUTS
_PowerPCBase - base of powerpc.library
MMUMode - CHMMU_STANDARD: change MMU setup to standard
CHMMU_BAT : change MMU setup to BAT setup
NOTES
This function should usually NOT be called. It is intended for
highly optimizing code and should only be used, if enough MMU
knowledge is present.
The state of the current task can be changed from the shell by
using the tool 'changemmu' (and this is the better way how to
change the setup rather than calling the library function)
SEE ALSO
powerpc/tasksppc.i
powerpc.library/ClearExcMMU powerpc.library/ClearExcMMU
NAME
ClearExcMMU - removes the temp. MMU setup installed by SetExcMMU (V10)
CPU
PowerPC
SYNOPSIS
ClearExcMMU(_PowerPCBase)
r3
void ClearExcMMU(struct Library *);
FUNCTION
This function is for exception handlers only. It removes the temporary
BAT based MMU setup, which was installed using SetExcMMU. The old MMU
state is restored.
INPUTS
_PowerPCBase - base of powerpc.library
NOTES
This function must not be called from anywhere else than from
an exception handler.
SEE ALSO
SetExcMMU
powerpc.library/CmpTimePPC powerpc.library/CmpTimePPC
NAME
CmpTimePPC - compares two timeval structures (V7)
CPU
PowerPC
SYNOPSIS
result = CmpTimePPC(_PowerPCBase, Dest, Source)
r3 r3 r4 r5
LONG CmpTimePPC(struct Library *, struct timeval *, struct timeval *);
FUNCTION
This routine compares two timeval structures.
This is the mirror function of timer/CmpTime.
INPUTS
_PowerPCBase - base of powerpc.library
Dest - pointer to a timeval structure
Source - pointer to a timeval structure
RESULT
0 - if both timeval structures are equal
-1 - if Dest is greater than Source
1 - if Dest is less than Source
NOTES
This function is safe to call from exception handlers
SEE ALSO
GetSysTimePPC, AddTimePPC, SubTimePPC
powerpc.library/CopyMemPPC powerpc.library/CopyMemPPC
NAME
CopyMemPPC - copies memory the fastest way possible (V12)
CPU
PowerPC
SYNOPSIS
CopyMemPPC(_PowerPCBase, source, dest, size)
r3 r4 r5 r6
void CopyMemPPC(struct Library *, void *, void *, ULONG);
FUNCTION
This function copies a source memory area to a destination memory
area. No overlapping is supported. CopyMemPPC tries to copy with
the highest bandwidth possible.
INPUTS
_PowerPCBase - base of powerpc.library
source - address of the source memory area
dest - address of the destination memory area
size - size of the memory area to be copied
NOTES
The highest performance can be achieved if both memory areas have
a minimal alignment of 8.
powerpc.library/CreateMsgPortPPC powerpc.library/CreateMsgPortPPC
NAME
CreateMsgPortPPC - creates a new PPC message port (V11)
CPU
PowerPC
SYNOPSIS
MsgPortPPC = CreateMsgPortPPC(_PowerPCBase)
r3 r3
struct MsgPortPPC *CreateMsgPortPPC(struct Library *);
FUNCTION
This function creates a new PowerPC message port. This is the only
way allowed to create a PPC message port. It is the mirror function
of exec/CreateMsgPort.
INPUTS
_PowerPCBase - base of powerpc.library
RESULT
MsgPortPPC - pointer to a MsgPortPPC structure or NULL for failure
NOTES
A PowerPC message port should be deleted using 'DeleteMsgPortPPC'
if it is not used anymore.
It's forbidden to access PPC message ports by the standard
exec message handling routines.
SEE ALSO
DeleteMsgPortPPC,FindPortPPC,AddPortPPC,RemPortPPC
powerpc/portsPPC.i
powerpc.library/CreateTaskPPC powerpc.library/CreateTaskPPC
NAME
CreateTaskPPC - creates a new PPC task (V8)
CPU
PowerPC
SYNOPSIS
TaskPPC = CreateTaskPPC(_PowerPCBase, TagItems)
r3 r3 r4
struct TaskPPC *CreateTaskPPC(struct Library *, struct TagItem *);
FUNCTION
This function creates a new PPC task under control of the tags passed.
All memory (inclusive stack) is allocated automatically.
PPC tasks are similar to exec tasks (the first element of the TaskPPC
structure is an exec task structure). The scheduling of these tasks
works similar to exec, so a running task blocks all tasks with lower
priority.
INPUTS
_PowerPCBase - base of powerpc.library
TagItems - pointer to a tagitem array. The following tags are
supported:
TASKATTR_CODE: pointer to the entry point of the new task
(MUST be specified)
TASKATTR_EXITCODE: pointer to the exit routine of the new task
TASKATTR_NAME: task name (MUST be specified)
TASKATTR_PRI: task priority (-128 ... 127). Default = 0.
TASKATTR_STACKSIZE: the desired stack size. If this tag is omitted
the default stack size will be 16K.
TASKATTR_R2: smalldata base of the PPC program
TASKATTR_R3:
...
TASKATTR_R10: parameters to be passed to the new task
in the specified registers
TASKATTR_MOTHERPRI: the priority is taken from the currently
running task (TASKATTR_PRI is ignored) (V9)
TASKATTR_BAT: lets the task run under BAT MMU setup by
default (V10)
RESULT
TaskPPC - pointer to a TaskPPC structure or NULL for failure
NOTES
If a 68K application only wants to call a PPC function, it's
better to use Run68K instead of creating a new PPC task.
While a PPC task created by Run68K is always connected to
the calling 68K process, a task created by CreateTaskPPC is
completely independent. If such a task peforms 68K calls, a
new mirror process on the 68K side is created.
If an alternative exit code is specified (TASKATTR_EXITCODE)
the value passed in TASKATTR_R2 remains intact in this exit
code.
SEE ALSO
DeleteTaskPPC,FindTaskPPC,powerpc/tasksPPC.i
powerpc.library/DeleteMsgPortPPC powerpc.library/DeleteMsgPortPPC
NAME
DeleteMsgPortPPC - deletes a PPC message port (V11)
CPU
PowerPC
SYNOPSIS
DeleteMsgPortPPC(_PowerPCBase, MsgPortPPC)
r3 r4
void DeleteMsgPortPPC(struct Library *, struct MsgPortPPC *);
FUNCTION
This function deletes a PowerPC message port created using
'CreateMsgPortPPC'. It is the mirror function of exec/DeleteMsgPort.
INPUTS
_PowerPCBase - base of powerpc.library
MsgPortPPC - Pointer to the message port to delete. It's safe to
pass NULL as parameter
NOTES
Calling 'DeleteMsgPortPPC' is the ONLY way allowed to delete a PPC
message port.
SEE ALSO
CreateMsgPortPPC,FindPortPPC,AddPortPPC,RemPortPPC
powerpc/portsPPC.i
powerpc.library/DeleteTaskPPC powerpc.library/DeleteTaskPPC
NAME
DeleteTaskPPC - deletes a PPC task (V8)
CPU
PowerPC
SYNOPSIS
DeleteTaskPPC(_PowerPCBase, PPCTask)
r3 r4
void DeleteTaskPPC(struct Library *, struct TaskPPC *);
FUNCTION
Deletes a PPC task created by CreateTaskPPC.
INPUTS
_PowerPCBase - base of powerpc.library
TaskPPC - PPC task to remove or NULL for self removal
NOTES
It's not encouraged to delete other tasks. This function
should only be called with a NULL parameter to remove the
calling task itself.
The system may also remove an existing 68K mirror process
connected to the calling PPC task.
SEE ALSO
CreateTaskPPC,FindTaskPPC,powerpc/tasksPPC.i
powerpc.library/EndSnoopTask powerpc.library/EndSnoopTask
NAME
EndSnoopTask - stops monitoring a PPC task (V13)
CPU
PowerPC
SYNOPSIS
EndSnoopTask (_PowerPCBase, SnoopID)
r3 r4
void EndSnoopTask (struct Library *, ULONG);
FUNCTION
This function removes a callback job, which was installed using
powerpc/SnoopTask.
INPUTS
_PowerPCBase - base of powerpc.library
SnoopID - The value returned by SnoopTask. It's safe to pass
NULL as parameter (is handled as no-op)
SEE ALSO
SnoopTask
powerpc.library/EnqueuePPC powerpc.library/EnqueuePPC
NAME
EnqueuePPC - inserts a node into a list sorted by priority (V8)
CPU
PowerPC
SYNOPSIS
EnqueuePPC(_PowerPCBase, list, node)
r3 r4 r5
void EnqueuePPC(struct Library *, struct List*, struct Node*);
FUNCTION
Inserts a node to a standard exec list based on the node priority.
In this way a list can be kept sorted by priority all the time.
New nodes will be inserted in front of the first node with a
lower priority. This is the mirror function of exec/Enqueue.
INPUTS
_PowerPCBase - base of powerpc.library (can be omitted)
list - a pointer to the target list
node - the node to enqueue
NOTES
This function is guaranteed to work correctly, if the PowerPCBase
is not passed in r3.
This function is safe to call from exception handlers.
SEE ALSO
InsertPPC, AddTailPPC, AddHeadPPC, RemovePPC, RemHeadPPC,
RemTailPPC, FindNamePPC, powerpc/listsPPC.i
powerpc.library/FindNamePPC powerpc.library/FindNamePPC
NAME
FindNamePPC - finds a node with given name (V8)
CPU
PowerPC
SYNOPSIS
node = FindNamePPC(_PowerPCBase, start, name)
r3 r3 r4 r5
struct Node *FindNamePPC(struct Library *, struct List*, STRPTR);
FUNCTION
Searches a list for a node with the given name. If multiple nodes
with same names should be found, this function can be called with
a node starting point.
INPUTS
_PowerPCBase - base of powerpc.library
list - a list header or a node to start the searche (if node,
this one is skipped)
name - the name of the node
NOTES
This function is guaranteed to work correctly, if the PowerPCBase
is not passed in r3.
This function is safe to call from exception handlers.
SEE ALSO
InsertPPC, AddTailPPC, AddHeadPPC, RemovePPC, RemHeadPPC,
RemTailPPC, EnqueuePPC, powerpc/listsPPC.i
powerpc.library/FindPortPPC powerpc.library/FindPortPPC
NAME
FindPortPPC - finds a public PPC message port by name (V11)
CPU
PowerPC
SYNOPSIS
MsgPortPPC = FindPortPPC(_PowerPCBase, name)
r3 r3 r4
struct MsgPortPPC* FindPortPPC(struct Library *, STRPTR);
FUNCTION
This function will search the global list of PPC message ports
for a port with the given name. No arbritation is needed. This
is the mirror function of exec/FindPort.
INPUTS
_PowerPCBase - base of powerpc.library
name - name of the PPC message port to search
RESULT
MsgPortPPC - pointer to a PPC message port or NULL if it was not
found.
SEE ALSO
CreateMsgPortPPC,DeleteMsgPortPPC,AddPortPPC,RemPortPPC
powerpc/portsPPC.i
powerpc.library/FindSemaphorePPC powerpc.library/FindSemaphorePPC
NAME
FindSemaphorePPC - finds a public semaphore (V8)
CPU
PowerPC
SYNOPSIS
SignalsemaphorePPC = FindSemaphorePPC(_PowerPCBase, SemaphoreName)
r3 r3 r4
struct signalsemaphorePPC *FindSemaphorePPC(struct Library *, STRPTR);
FUNCTION
Finds a public semaphore added to the system semaphore list by
AddSemaphore. This is the mirror function to exec/FindSemaphore.
INPUTS
_PowerPCBase - base of powerpc.library
SemaphoreName - name of the semaphore to find
RESULT
SignalsemaphorePPC - signal semaphore requested or 0 if it was not
found
SEE ALSO
InitSemaphorePPC, FreeSemaphorePPC, ObtainSemaphorePPC,
AttemptSemaphorePPC, ReleaseSemaphorePPC, AddSemaphorePPC,
RemSemaphorePPC, powerpc/semaphoresPPC.i
powerpc.library/FindTagItemPPC powerpc.library/FindTagItemPPC
NAME
FindTagItemPPC - scan a tag list for a specific tag (V8)
CPU
PowerPC
SYNOPSIS
tag = FindTagItemPPC(_PowerPCBase, tagValue, tagList)
r3 r3 r4 r5
struct TagItem *FindTagItemPPC(struct Library *, ULONG,
struct TagItem *);
FUNCTION
Scans a tag list and returns a pointer to the first item with
ti_Tag matching the 'tagValue' parameter. This is the mirror
function of utility/FindTagItem.
INPUTS
_PowerPCBase - base of powerpc.library
tagValue - tag value to search for
tagList - tag item list to search (may be NULL)
RESULT
tag - a pointer to the item with ti_Tag matching 'tagValue'
or NULL if no match was found.
NOTES
This function is safe to call from exception handlers.
SEE ALSO
GetTagDataPPC, NextTagItemPPC, utility/tagitem.i
powerpc.library/FindTaskPPC powerpc.library/FindTaskPPC
NAME
FindTaskPPC - finds a task by name (or find oneself) (V8)
CPU
PowerPC
SYNOPSIS
TaskPPC = FindTaskPPC(_PowerPCBase, Name)
r3 r3 r4
struct TaskPPC *FindTaskPPC(struct Library *, STRPTR);
FUNCTION
Tries to find a task with the given name (or the current task if
NULL is specified). This is the mirror function of exec/FindTask.
INPUTS
_PowerPCBase - base of powerpc.library
Name - name of the task to find or NULL for the current task
RESULT
TaskPPC - pointer to the TaskPPC structure or NULL if the task
was not found
NOTES
Be cautious that a task may be removed at any time, so the
pointer returned may not be valid anymore when used.
It's allowed to call FindTaskPPC with a NULL parameter from
an exception handler. In this case the interrupted task is
returned.
SEE ALSO
CreateTaskPPC,DeleteTaskPPC,powerpc/tasksPPC.i
powerpc.library/FreeAllMem powerpc.library/FreeAllMem
NAME
FreeAllMem - frees all memory allocated by the calling task (V11)
CPU
PowerPC
SYNOPSIS
FreeAllMem(_PowerPCBase)
r3
void FreeVecPPC(struct Library *);
FUNCTION
Frees all memory which was allocated by the calling task. This is an
easy way to free the memory rather than calling FreeVecPPC for every
allocation made.
INPUTS
_PowerPCBase - base of powerpc.library
SEE ALSO
AllocVecPPC,FreeVecPPC,powerpc/memoryPPC.i
powerpc.library/FreeSemaphorePPC powerpc.library/FreeSemaphorePPC
NAME
FreeSemaphorePPC - frees a signal semaphore (V8)
CPU
PowerPC
SYNOPSIS
FreeSemaphorePPC(_PowerPCBase, SignalSemaphorePPC)
r3 r4
void FreeSemaphorePPC(struct Library *, struct SignalSemaphorePPC *);
FUNCTION
Frees a signal semaphore initialized by InitSemaphorePPC. There
is no similar function in exec.library!
INPUTS
_PowerPCBase - base of powerpc.library
SignalSemaphorePPC - pointer to a signalsemaphorePPC structure
SEE ALSO
InitSemaphorePPC, ObtainSemaphorePPC, AttemptSemaphorePPC,
ReleaseSemaphorePPC, AddSemaphorePPC, RemSemaphorePPC,
FindSemaphorePPC, powerpc/semaphoresPPC.i
powerpc.library/FreeSignalPPC powerpc.library/FreeSignalPPC
NAME
FreeSignalPPC - frees a signal (V8)
CPU
PowerPC
SYNOPSIS
FreeSignalPPC(_PowerPCBase, signalNum)
r3 r4
void FreeSignalPPC(struct Library *, LONG);
FUNCTION
Frees a signal bit allocated by AllocSignalPPC. This is the
mirror function of exec/FreeSignal.
INPUTS
_PowerPCBase - base of powerpc.library
signalNum - the signal bit number to free (0..31). It's
safe to pass -1 as input parameter.
SEE ALSO
AllocSignalPPC, SetSignalPPC, SignalPPC, WaitPPC
powerpc.library/FreeVecPPC powerpc.library/FreeVecPPC
NAME
FreeVecPPC - frees memory allocated by AllocVecPPC (V7)
CPU
PowerPC
SYNOPSIS
status = FreeVecPPC(_PowerPCBase, memblock)
r3 r3 r4
LONG FreeVecPPC(struct Library *, void *);
FUNCTION
Frees memory allocated by AllocVecPPC. This is the mirror function
of exec/FreeVec.
INPUTS
_PowerPCBase - base of powerpc.library
memblock - address of memory to be freed. It's safe to pass NULL
as input parameter.
RESULT
status - a status value:
MEMERR_SUCCESS - operation was successful
SEE ALSO
AllocVecPPC, FreeAllMem, powerpc/memoryPPC.i
powerpc.library/FreeXMsgPPC powerpc.library/FreeXMsgPPC
NAME
FreeXMsgPPC - frees a message allocated with 'AllocXMsgPPC' (V12)
CPU
PowerPC
SYNOPSIS
FreeXMsgPPC(_PowerPCBase, message)
r3 r4
void FreeXMsgPPC(struct Library *, struct Message *);
FUNCTION
This function frees a memory allocated using 'AllocXMsgPPC'.
INPUTS
_PowerPCBase - base of powerpc.library
message - a message allocated by 'AllocXMsgPPC'.
NOTES
[An Inter-CPU message must not be freed, if it was sent to
a 68K task and the reply has not yet arrived back.]
The above statement is not valid anymore. Inter-CPU-Messages
can be freed by another 68K task even if it wasn't replied.
SEE ALSO
AllocXMsgPPC, PutXMsgPPC
powerpc.library/GetInfo powerpc.library/GetInfo
NAME
GetInfo - evaluates many CPU related information (V10)
CPU
PowerPC
SYNOPSIS
GetInfo(_PowerPCBase, PPCInfoTagList)
r3 r4
void GetInfo(struct Library *, struct TagItem *);
FUNCTION
This function is able to evaluate many CPU related information
such as CPU type, cache states and more. The values which should
be evaluated are specified using the appropriate tags (defined
in powerpc/powerpc.i) and the value is returned in the appropriate
ti_Data field.
INPUTS
_PowerPCBase - base of powerpc.library
PPCInfoTagList - pointer to a tagitem array. The following tags are
supported:
PPCINFO_CPU: evaluates the PowerPC CPU type (see powerpc/
powerpc.i for a description of the possible
return values)
PPCINFO_PVR: returns the PVR register which also contains
the revision number of the CPU besides the
CPU type.
PPCINFO_ICACHE: returns the state of the instruction cache
See powerpc/powerpc.i for a description of
the possible values.
PPCINFO_DCACHE: returns the state of the data cache. The
values possible are the same as for PPCINFO_
ICACHE.
PPCINFO_PAGETABLE: returns the location of the standard page table
PPCINFO_TABLESIZE: returns the size of the page table (in KBytes)
PPCINFO_BUSCLOCK: returns the bus clock value (in Hz)
PPCINFO_CPUCLOCK: returns the CPU clock value (in Hz)
NOTES
The CPU clock cannot be evaluated on PowerPC systems without the
extension E (for example PPC603,PPC604) because the supervisor
register HID1 is missing. In this case, 0 is returned.
Usually the PPC-CPU's available for AMIGA will have this register
(for example: PPC603E, PPC604E)
SEE ALSO
powerpc/powerpc.i
powerpc.library/GetMsgPPC powerpc.library/GetMsgPPC
NAME
GetMsgPPC - get next message from a message port (V11)
CPU
PowerPC
SYNOPSIS
message = GetMsgPPC(_PowerPCBase, MsgPortPPC)
r3 r3 r4
struct Message *GetMsgPPC(struct Library *, struct MsgPortPPC *);
FUNCTION
This function receives a message from a given message port. This
is the mirror function of exec/GetMsg.
INPUTS
_PowerPCBase - base of powerpc.library
port - a pointer to a message port
RESULTS
message - a pointer to the first available message or NULL if none
is available.
SEE ALSO
WaitPortPPC, PutMsgPPC, ReplyMsgPPC, powerpc/portsPPC.i
powerpc.library/GetSysTimePPC powerpc.library/GetSysTimePPC
NAME
GetSysTimePPC - get the current (relative) time (V7)
CPU
PowerPC
SYNOPSIS
GetSysTimePPC(_PowerPCBase, Dest )
r3 r4
void GetSysTimePPC(struct Library *, struct timeval * );
FUNCTION
Returns the current system time. This time is NOT absolute, there
is no relation between the real time and the time returned by
GetSysTimePPC. This function can be used for measurement of
time spans.
This is the mirror function of timer/GetSysTime.
INPUTS
_PowerPCBase - base of powerpc.library
Dest - pointer to a timeval structure (where the time is stored)
NOTES
This function has different behaviour on powerpc.library V7 and
powerpc.library V8+.
V7: The time is evaluated using the timer.device (via a cross
call) because it isn't possible to evaluate the busclock frequency
of the PPC with V7 (and ppc.library below) until now.
V8+: The time is evaluated completely native (and fast) using the
internal timers and the busclock frequency evaluated by WarpOS.
This function is safe to call from exception handlers ONLY in
powerpc.library V8 and higher !!
SEE ALSO
AddTimePPC, SubTimePPC, CmpTimePPC
powerpc.library/GetTagDataPPC powerpc.library/GetTagDataPPC
NAME
GetTagDataPPC - obtain the data corresponding to a tag (V8)
CPU
PowerPC
SYNOPSIS
value = GetTagDataPPC(_PowerPCBase, tagValue, defaultVal, tagList)
r3 r3 r4 r5 r6
ULONG *GetTagDataPPC(struct Library *, ULONG, ULONG, struct TagItem* );
FUNCTION
Searches a tag list for a matching tag and returns the corresponding
ti_Data value for the TagItem found. If no match is found,
this function returns the value passed in as 'defaultVal'. This
is the mirror function of utility/GetTagData.
INPUTS
_PowerPCBase - base of powerpc.library
tagValue - tag value to search for
defaultVal - value to be returned if tagValue is not found
tagList - tag item list to search (may be NULL)
RESULT
value - the ti_Data value for the first matching TagItem, or
'defaultVal' if a ti_Tag matching Tag is not found.
NOTES
This function is safe to call from exception handlers.
SEE ALSO
FindTagItemPPC, NextTagItemPPC, utility/tagitem.i
powerpc.library/InitSemaphorePPC powerpc.library/InitSemaphorePPC
NAME
InitSemaphorePPC - initializes a signal semaphore (V8)
CPU
PowerPC
SYNOPSIS
status = InitSemaphorePPC(_PowerPCBase, SignalSemaphorePPC)
r3 r3 r4
LONG InitSemaphorePPC(struct Library *, struct SignalSemaphorePPC *);
FUNCTION
Initializes a signal semaphore. This is the mirror function of
exec/InitSemaphore with some changes.
INPUTS
_PowerPCBase - base of powerpc.library
SignalSemaphorePPC - pointer to a signalsemaphorePPC structure
(all fields to zero)
RESULT
status - status value:
SSPPC_SUCCESS: function was successful
SSPPC_NOMEM: function failed due to lack of memory
NOTES
In opposite to exec/InitSemaphore a signal semaphore for PPC
has to be freed with FreeSemaphorePPC, because InitSemaphorePPC
allocates memory which should be freed after use.
SEE ALSO
FreeSemaphorePPC, ObtainSemaphorePPC, AttemptSemaphorePPC,
ReleaseSemaphorePPC, AddSemaphorePPC, RemSemaphorePPC,
FindSemaphorePPC, powerpc/semaphoresPPC.i
powerpc.library/InsertPPC powerpc.library/InsertPPC
NAME
InsertPPC - insert a node into a list (V8)
CPU
PowerPC
SYNOPSIS
Insert(_PowerPCBase, list, node, nodepredecessor)
r3 r4 r5 r6
void InsertPPC(struct Library *, struct List*, struct Node*,
struct Node*);
FUNCTION
Insert a node into an standard exec list. This is the mirror
function of exec/Insert.
INPUTS
_PowerPCBase - base of powerpc.library (can be omitted)
list - a pointer to the target list
node - the node to insert
nodepredecessor - the node after which to insert. If 0 is passed,
the node is inserted at the head of the list.
NOTES
This function is guaranteed to work correctly, if the PowerPCBase
is not passed in r3.
This function is safe to call from exception handlers.
SEE ALSO
AddHeadPPC, AddTailPPC, RemovePPC, RemHeadPPC, RemTailPPC,
EnqueuePPC, FindNamePPC, powerpc/listsPPC.i
powerpc.library/LockTaskList powerpc.library/LockTaskList
NAME
LockTaskList - locks a list of all tasks (V10)
CPU
PowerPC
SYNOPSIS
TaskPtr = LockTaskList(_PowerPCBase)
r3 r3
struct TaskPtr* LockTaskList(struct Library *);
FUNCTION
This function locks a list of all PPC tasks currently available.
The main purpose of this function is to allow examining the
PPCtask structures without to worry about protecting the access
by semaphores (this is done internally).
The usual method of accessing the task information is the
following:
- Lock the task list using 'LockTaskList'
- Get the pointer to the first task (by reading out the entry
TASKPTR_TASK of the returned TaskPtr structure)
- Scan trough the list and read out all infomation you need until
you find the end of the list
- Unlock the list using 'UnLockTaskList'
INPUTS
_PowerPCBase - base of powerpc.library
RESULTS
TaskPtr - Ptr to the first node of a list of TaskPtr structures
(see powerpc/tasksppc.i)
NOTES
The WarpOS multitasking is NOT halted between LockTaskList and
UnLockTaskList.
No new tasks are created and no resources of removed tasks are
freed between LockTaskList and UnLockTaskList. So don't lock the
list for a too long time.
SEE ALSO
UnLockTaskList, powerpc/tasksppc.i
powerpc.library/ModifyFPExc powerpc.library/ModifyFPExc
NAME
ModifyFPExc - enables/disables specific floating point exceptions (V9)
CPU
PowerPC
SYNOPSIS
ModifyFPExc(_PowerPCBase, FPflags)
r3 r4
void ModifyFPExc(struct Library *, ULONG);
FUNCTION
This function allows to enable/disable particular floating
point exceptions. Multiple exceptions can be affected
simultaneously.
INPUTS
_PowerPCBase - base of powerpc.library
FPflags - action to be performed:
FPF_EN_OVERFLOW: Enables FP overflow exception
FPF_EN_UNDERFLOW: Enables FP underflow exception
FPF_EN_ZERODIVIDE: Enables FP zero divide exception
FPF_EN_INEXACT: Enables FP inexact operation exception
FPF_EN_INVALID: Enables FP invalid operation exception
FPF_DIS_OVERFLOW: Disables FP overflow exception
FPF_DIS_UNDERFLOW: Disables FP underflow exception
FPF_DIS_ZERODIVIDE: Disables FP zero divide exception
FPF_DIS_INEXACT: Disables FP inexact operation exception
FPF_DIS_INVALID: Disables FP invalid operation exception
NOTES
Floating point exceptions must be enabled globally using 'SetHardware'
otherwise this function doesn't have any effect.
SEE ALSO
SetHardware, powerpc/powerpc.i
powerpc.library/NextTagItemPPC powerpc.library/NextTagItemPPC
NAME
NextTagItemPPC - iterate through a tag list (V8)
CPU
PowerPC
SYNOPSIS
tag = NextTagItemPPC(_PowerPCBase, tagItemPtr)
r3 r3 r4
struct TagItem *NextTagItemPPC(struct Library *, struct TagItem **);
FUNCTION
Iterates through a tag list, skipping and chaining as dictated by
system tags. Each call returns either the next item to be examined
or NULL when the end of the list has benn reached. This is the
mirror function of utility/NextTagItem.
INPUTS
_PowerPCBase - base of powerpc.library
tagItemPtr - double-indirect reference to a TagItem structure.
The pointer will be changed to keep track of the
iteration.
RESULT
tag - each TagItem in the array that should be processed is
returned in turn with succesive calls.
NOTES
This function is safe to call from exception handlers.
SEE ALSO
FindTagItemPPC, GetTagDataPPC, utility/tagitem.i
powerpc.library/ObtainSemaphorePPC powerpc.library/ObtainSemaphorePPC
NAME
ObtainSemaphorePPC - gain exclusive access to a semaphore (V8)
CPU
PowerPC
SYNOPSIS
ObtainSemaphorePPC(_PowerPCBase, SignalSemaphorePPC)
r3 r4
void ObtainSemaphorePPC(struct Library *, struct SignalSemaphorePPC *);
FUNCTION
Tries to get exclusive access to a signal semaphore. If the semaphore
is occupied, the task adds itself into a waiting queue. This is the
mirror function of exec/ObtainSemaphore.
INPUTS
_PowerPCBase - base of powerpc.library
SignalSemaphorePPC - pointer to a signalsemaphorePPC structure
NOTES
This call is guaranteed to preserve all GPR (except r0) and the CTR.
SEE ALSO
InitSemaphorePPC, FreeSemaphorePPC, AttemptSemaphorePPC,
ReleaseSemaphorePPC, AddSemaphorePPC, RemSemaphorePPC
FindSemaphorePPC, powerpc/semaphoresPPC.i
powerpc.library/PutMsgPPC powerpc.library/PutMsgPPC
NAME
PutMsgPPC - put a message to a message port (V11)
CPU
PowerPC
SYNOPSIS
PutMsgPPC(_PowerPCBase, MsgPortPPC, message)
r3 r4 r5
void PutMsgPPC(struct Library *, struct MsgPortPPC *, struct Messge *);
FUNCTION
This function attaces a message to the end of the given port. In
opposition to exec/PutMsg, only ports with PA_SIGNAL are supported.
This is the mirror function of exec/PutMsg.
INPUTS
_PowerPCBase - base of powerpc.library
port - a pointer to a message port
message - a pointer to the message to be sent
NOTES
This function is safe to call from exception handlers.
SEE ALSO
WaitPortPPC, GetMsgPPC, ReplyMsgPPC, powerpc/portsPPC.i
powerpc.library/PutXMsgPPC powerpc.library/PutXMsgPPC
NAME
PutXMsgPPC - sends an Inter-CPU message to a 68K task (V12)
CPU
PowerPC
SYNOPSIS
PutXMsgPPC(_PowerPCBase, MsgPort, message)
r3 r4 r5
void PutXMsgPPC(struct Library *, struct MsgPort *, struct Message *);
FUNCTION
This function sends an Inter-CPU message allocated by 'AllocXMsgPPC'
to a 68K task.
INPUTS
_PowerPCBase - base of powerpc.library
MsgPort - an exec message port
message - a message allocated by 'AllocXMsgPPC'.
NOTES
Inter-CPU must NOT be used for internal communication. They can
only be used for communication between tasks on different processors.
Inter-CPU messages get a different node type, if they are
sent. If you want to filter out Reply-Messages from standard
or Inter-CPU messages, compare the LN_TYPE field to NT_REPLYMSG.
Replied Inter-CPU messages still get the same node type
(NT_REPLYMSG). Any assumptions about the value of the new
node type are ILLEGAL!!
As soon as an Inter-CPU message is sent, the PPC looses ownership
over the message. No access to the message is allowed until the
reply has been arrived.
Inter-CPU messages can be reused if they have been replied.
Inter-CPU messages are read and replied using the standard
message handling mechanisms (exec/WaitPort,exec/GetMsg,exec/ReplyMsg
for 68K, powerpc/WaitPortPPC, powerpc/GetMsgPPC, powerpc/ReplyMsgPPC
for PPC).
The receiving task must NOT access message data, which are not
explicitely located in the message body (for example data which is
referenced by a pointer) unless both tasks care for the cache
consistency. Only the message itself is flushed/invalidated
automatically by the system.
The receiving task may write to the message body of an Inter-CPU
message.
Inter-CPU messages should always be replied and the reply should
be read and filtered out.
SEE ALSO
AllocXMsgPPC, FreeXMsgPPC
powerpc.library/ReleaseSemaphorePPC powerpc.library/ReleaseSemaphorePPC
NAME
ReleaseSemaphorePPC - make signal semaphore available to others (V8)
CPU
PowerPC
SYNOPSIS
ReleaseSemaphorePPC(_PowerPCBase, SignalSemaphorePPC)
r3 r4
void ReleaseSemaphorePPC(struct Library *,
struct SignalSemaphorePPC *);
FUNCTION
Releases a semaphore locked by either ObtainSemaphorePPC or
AttemptSemaphorePPC. If other tasks are waiting, the foremost
in the waiting queue is waked up.
INPUTS
_PowerPCBase - base of powerpc.library
SignalSemaphorePPC - pointer to a signalsemaphorePPC structure
NOTES
This call is guaranteed to preserve all GPR (except r0) and the CTR.
If the semaphore is in an illegal state after calling
ReleaseSemaphorePPC, a system message will appear and the task is
put into waiting state.
SEE ALSO
InitSemaphorePPC, FreeSemaphorePPC, ObtainSemaphorePPC,
AttemptSemaphorePPC, AddSemaphorePPC, RemSemaphorePPC
FindSemaphorePPC, powerpc/semaphoresPPC.i
powerpc.library/RemExcHandler powerpc.library/RemExcHandler
NAME
RemExcHandler - removes a custom exception handler (V9)
CPU
PowerPC
SYNOPSIS
RemExcHandler(_PowerPCBase, XLock)
r3 r4
void RemExcHandler(struct Library *, void *);
FUNCTION
Removes an exception handler inserted by the function SetExcHandler.
INPUTS
_PowerPCBase - base of powerpc.library
XLock - The lock value returned by SetExcHandler. It's safe to pass
NULL as parameter
SEE ALSO
RemExcHandler, powerpc/powerpc.i
powerpc.library/RemHeadPPC powerpc.library/RemHeadPPC
NAME
RemHeadPPC - removes the head node from a list (V8)
CPU
PowerPC
SYNOPSIS
node = RemHeadPPC(_PowerPCBase, list)
r3 r3 r4
struct Node *RemHeadPPC(struct Library *, struct List*);
FUNCTION
Removes the head node of a list. This is the mirror function of
exec/RemHead.
INPUTS
_PowerPCBase - base of powerpc.library (can be omitted)
list - the target list from which the head node should be removed
RESULT
node - the node removed or 0 if the list was empty
NOTES
This function is guaranteed to work correctly, if the PowerPCBase
is not passed in r3.
Assembler programmers may use the macro _REMHEAD located in
'powerpc/listsPPC.i'
This function is safe to call from exception handlers.
SEE ALSO
InsertPPC, AddTailPPC, AddHeadPPC, RemovePPC, RemTailPPC,
EnqueuePPC, FindNamePPC, powerpc/listsPPC.i
powerpc.library/RemovePPC powerpc.library/RemovePPC
NAME
RemovePPC - removes a node from a list (V8)
CPU
PowerPC
SYNOPSIS
RemovePPC(_PowerPCBase, node)
r3 r4
void RemovePPC(struct Library *, struct Node*);
FUNCTION
Removes a node from whatever list it is in. This is the mirror
function of exec/Remove.
INPUTS
_PowerPCBase - base of powerpc.library (can be omitted)
node - the node to remove
NOTES
This function is guaranteed to work correctly, if the PowerPCBase
is not passed in r3.
Assembler programmers may use the macro _REMOVE located in
'powerpc/listsPPC.i'
This function is safe to call from exception handlers.
SEE ALSO
InsertPPC, AddTailPPC, AddHeadPPC, RemHeadPPC, RemTailPPC,
EnqueuePPC, FindNamePPC, powerpc/listsPPC.i
powerpc.library/RemPortPPC powerpc.library/RemPortPPC
NAME
RemPortPPC - removes a public PPC message port from the system (V11)
CPU
PowerPC
SYNOPSIS
RemPortPPC(_PowerPCBase, MsgPortPPC)
r3 r4
void RemPortPPC(struct Library *, struct MsgPortPPC *);
FUNCTION
This function removes a public message port from the global list
of message ports. It is the mirror function of exec/RemPort.
INPUTS
_PowerPCBase - base of powerpc.library
MsgPortPPC - pointer to a PPC message port. It's safe to pass a NULL
parameter.
SEE ALSO
CreateMsgPortPPC,DeleteMsgPortPPC,FindPortPPC,AddPortPPC
powerpc/portsPPC.i
powerpc.library/RemTailPPC powerpc.library/RemTailPPC
NAME
RemTailPPC - removes the tail node from a list (V8)
CPU
PowerPC
SYNOPSIS
node = RemTailPPC(_PowerPCBase, list)
r3 r3 r4
struct Node *RemTailPPC(struct Library *, struct List*);
FUNCTION
Removes the tail node of a list. This is the mirror function of
exec/RemTail.
INPUTS
_PowerPCBase - base of powerpc.library (can be omitted)
list - the target list from which the tail node should be removed
RESULT
node - the node removed or 0 if the list was empty
NOTES
This function is guaranteed to work correctly, if the PowerPCBase
is not passed in r3.
Assembler programmers may use the macro _REMTAIL located in
'powerpc/listsPPC.i'
This function is safe to call from exception handlers.
SEE ALSO
InsertPPC, AddTailPPC, AddHeadPPC, RemovePPC, RemHeadPPC,
EnqueuePPC, FindNamePPC, powerpc/listsPPC.i
powerpc.library/RemSemaphorePPC powerpc.library/RemSemaphorePPC
NAME
RemSemaphorePPC - removes a global signal semaphore (V8)
CPU
PowerPC
SYNOPSIS
RemSemaphorePPC(_PowerPCBase, SignalSemaphorePPC)
r3 r4
void RemSemaphorePPC(struct Library *, struct SignalSemaphorePPC *);
FUNCTION
Removes a global signal semaphore created by AddSemaphorePPC. This
is the mirror function of exec/RemSemaphore.
INPUTS
_PowerPCBase - base of powerpc.library
SignalSemaphorePPC - pointer to a signalsemaphorePPC structure
SEE ALSO
InitSemaphorePPC, FreeSemaphorePPC, ObtainSemaphorePPC,
AttemptSemaphorePPC, ReleaseSemaphorePPC, AddSemaphorePPC,
FindSemaphorePPC, powerpc/semaphoresPPC.i
powerpc.library/ReplyMsgPPC powerpc.library/ReplyMsgPPC
NAME
ReplyMsgPPC - put a message to its reply port (V11)
CPU
PowerPC
SYNOPSIS
ReplyMsgPPC(_PowerPCBase, message)
r3 r4
void ReplyMsgPPC(struct Library *, struct Messge *);
FUNCTION
This function sends a message to its reply port, if one is present.
This is the mirror function of exec/ReplyMsg.
INPUTS
_PowerPCBase - base of powerpc.library
message - a pointer to the message to be replied
NOTES
This function is safe to call from exception handlers.
SEE ALSO
WaitPortPPC, PutMsgPPC, GetMsgPPC, powerpc/portsPPC.i
powerpc.library/Run68K powerpc.library/Run68K
NAME
Run68K - runs a 680x0 function resp. AMIGA-OS library function (V7)
CPU
PowerPC
SYNOPSIS
status = Run68K(_PowerPCBase, PPStruct )
r3 r3 r4
LONG RunPPC (struct Library *, struct PowerPC *);
FUNCTION
Runs a 680x0 function or an AMIGA-OS library function. All registers
can be transferred to 68K as well as parameters on stack. All cache
management actions are handled automatically.
All registers are transferred back from 68K after the 68K call
is completed. They are stored in the PowerPC structure.
See RunPPC for the register assignment.
INPUTS
_PowerPCBase - base of powerpc.library
PPStruct - Pointer to an initialized PowerPC Structure
PP_CODE : Pointer to the 680x0 code resp. pointer to the
library base (if PP_OFFSET is not zero).
PP_OFFSET : Library offset or 0 if no library function is
called.
PP_FLAGS : Flags which can be ore'd together
- PP[F/P]_ASYNC : call 68K function asynchronely (PPC process
returns immediately)
PP_STACKPTR : Pointer to the arguments on the stack to be
transferred. The pointer must point to the top
of the calling process' stackframe. The stack area
to be transferred is located at offset 24 from this
position. If no arguments on stack should be
transferred, set this to zero.
PP_STACKSIZE : Size of the stack area to be transferred. If no
stack parameters should be transferred, set this
to zero.
PP_REGS : Array of longwords where the registers to be
transferred can be stored (d0-a6)
PP_FREGS : Array of quadwords (8 bytes) where the FP-registers
to be transferred can be stored (fp0-fp7)
RESULT
status - PPERR_SUCCESS if the call was successfully
PPERR_ASYNCERR if a synchrone 68K call was made after an
asynchrone 68K call
NOTES
Calling a 68K function asynchronely is dangerous. Take care of
possible cache conflicts. Avoid calling system functions as much
as possible.
If an asynchrone 68K call is done, the function WaitFor68K MUST be
called ONCE after the call was done. No other 68K call is allowed
for this PPC process after an asynchrone 68K call and before a call
to WaitFor68K.
If an asynchronely called 68K function performs a PPC call, the call
is only performed when WaitFor68K is called by the PPC process. Note
that the 68K mirror process is still connected to the calling PPC
process.
DON'T pass arguments on stack when calling a 68K function asynchronely.
The stack is most likely to be trashed before it is copied to the 68K
stack.
Assembler programmers should use the macros RUN68K and
RUN68K_XL located in the include file 'powerpc/powerpc.i'
SEE ALSO
WaitFor68K,powerpc/powerpc.i
powerpc.library/SetCache powerpc.library/SetCache
NAME
SetCache - cache manipulation function (V8)
CPU
PowerPC
SYNOPSIS
SetCache(_PowerPCBase, cacheflags, start, length)
r3 r4 r5 r6
void SetCache(struct Library *, ULONG, void *, ULONG);
FUNCTION
This function offers many possibilities to affect the caches of
the PPC. It performs the action defined by the cache flags. Only
one action can be performed at the same time.
INPUTS
_PowerPCBase - base of powerpc.library
cacheflags - action to be performed:
CACHE_DCACHEOFF: Data cache is disabled. The Cache is flushed
automatically.
CACHE_DCACHEON: Data cache is enabled.
CACHE_DCACHELOCK: Data cache is locked (is ignored if either
'start' or 'length' is zero).
CACHE_DCACHEUNLOCK: Data cache is unlocked.
CACHE_DCACHEFLUSH: Data cache is flushed.
CACHE_ICACHEOFF: Instruction cache is disabled.
CACHE_ICACHEON: Instruction cache is enabled.
CACHE_ICACHELOCK: Instruction cache is locked.
CACHE_ICACHEUNLOCK: Instruction cache is unlocked.
CACHE_ICACHEINV: Instruction cache is invalidated.
start - pointer to the start address of the area to be affected.
The following cacheflags support an area specification:
CACHE_DCACHELOCK, CACHE_DCACHEFLUSH, CACHE_ICACHEINV
if 'start' is 0 the whole address space is affected
length - length of the area to be affected (see above for the
cache flags which support area specification).
if 'length' is 0 the whole address space is affected
NOTES
Invalidating the whole instruction cache is much more efficient
than flushing only a part of it.
Flushing the whole data cache is less efficient than flushing
a specific area, if this area is not too large.
The cacheflag DCACHELOCK requires 'start' and 'length' to be not
zero. The area specified is then copied into the data cache and
the data cache is locked afterwards.
The caches should not be switched on/off resp. locked/unlocked
without GOOD justification. Global manipulations of the cache
should be avoided. Better affect the cache locally by using
AllocVecPPC.
This function is safe to call from exception handlers
SEE ALSO
powerpc/powerpc.i
powerpc.library/SetExcHandler powerpc.library/SetExcHandler
NAME
SetExcHandler - insert a custom exception handler (V9)
CPU
PowerPC
SYNOPSIS
XLock = SetExcHandler(_PowerPCBase, ExcTags)
r3 r3 r4
void *SetExcHandler(struct Library *, struct TagItem *);
FUNCTION
This function allows applications to insert custom exception
handlers. Those handlers can be global or task dependant,
priorities are also supported. Multiple exceptions can be
selected for one exception handler.
The exception handlers are executed in supervisor mode and
have access to all supervisor registers.
The handlers are called in one of two possible ways (dependant
of the tag EXC_FLAGS):
1) EXC_FLAGS has the flag EXCF_SMALLCONTEXT set:
Status = CustomHandler(SmallContext)
r3 r3
ULONG CustomHandler(struct XCONTEXT*)
Inputs:
SmallContext - a pointer to a XCONTEXT structure (see
powerpc/powerpc.i)
Result:
Status - a return value which decides, whether the
exception should be leaved immediately or
if following exception handlers should be
executed, too (see powerpc/powerpc.i)
In this first method, the handler gets all registers directly,
except for r3, which is passed in the XCONTEXT structure. The
exception ID, which gives information about the kind of
exception occurred, is passed also in XCONTEXT structure.
All registers which are modified by the exception handler are
also modified for the interrupted task. If r3 should be modified
for the interrupted task, the appropriate field of the XCONTEXT
structure has to be modified.
Some of the interrupted task's registers are passed in special
supervisor registers. If they should be changed, the appropriate
supervisor registers have to be changed:
SPRG1 - The interrupted task's Link Register
SPRG2 - The interrupted task's Stackpointer (r1)
SPRG3 - The interrupted task's Smalldata Base (r2)
The exception stack, which is passed in r1, is allocated from the
user stack of the interrupted task.
2) EXC_FLAGS has the flag EXCF_LARGECONTEXT set:
Status = CustomHandler(LargeContext)
r3 r3
ULONG CustomHandler(struct EXCCONTEXT*)
Inputs:
LargeContext - a pointer to a EXCCONTEXT structure (see
powerpc/powerpc.i)
Result:
Status - a return value which decides, whether the
exception should be leaved immediately or
if following exception handlers should be
executed, too (see powerpc/powerpc.i)
In this second method, the handler gets all registers in the
EXCCONTEXT structure. If the handler wishes to change some
of the register contents it must change the appropriate fields
in the EXCCONTEXT structure which are copied back to the
registers after the custom handler has completed. If no
field is provided for a certain register, it has to be modified
directly.
The exception stack, which is passed in r1, is allocated from the
user stack of the interrupted task.
INPUTS
_PowerPCBase - base of powerpc.library
ExcTags - pointer to a tagitem array. The following tags are
supported:
EXCATTR_CODE: pointer to the exception handler code
(required)
EXCATTR_DATA: a user data which is passed in r2 to the
custom exception handler. This is usually
a base register which provides access to
all global data required.
EXCATTR_TASK: specifies the task which is allowed to take
the exception handler. If this tag is 0 or
omitted, the current task is taken instead.
This tag has no effect if the exception
handler is specified as global (see below
at EXCATTR_FLAGS)
EXCATTR_EXCID: Defines which exceptions should call this
exception handler. See powerpc/powerpc.i
for a description of all supported exceptions.
Multiple exceptions can be selected.
EXCATTR_FLAGS:
EXCF_GLOBAL: Marks the exception handler as global. It
is then called for every exception occurred.
EXCF_LOCAL: Marks the exception handler as local. It is
then only called, if the interrupted task
matches the task specified in EXCATTR_TASK.
EXCF_SMALLCONTEXT: The exception handler is called with a
XCONTEXT structure as parameter (see above
for a description of this mode).
EXCF_LARGECONTEXT: The exception handler is called with a
EXCCONTEXT structure as parameter (see above
for a description of this mode).
One flag of EXCF_GLOBAL and EXCF_LOCAL and one
flag of EXCF_SMALLCONTEXT and EXCF_LARGECONTEXT
must be specified, otherwise this function
fails.
EXCATTR_NAME: An identification name for this handler
EXCATTR_PRI: The priority of this exception handler
RESULT
XLock - A lock to be passed to RemExcHandler or 0 if something
failed.
NOTES
Exception handlers should generally take care that they don't
destroy any registers of the interrupted task except if it is
desired. Special care must be taken if the exception handler is
called with the small context structure (take care of r0!). All
registers, inclusive CR, CTR, LR and others must be restored if
they should not be changed.
IMPORTANT: The exception handler is called with MMU switched off!
The whole address space is accessed in cachable copyback mode, so
no access to critical locations such as custom chip space must
be performed. If such locations should be accessed, a temporary
MMU setup must be done using the library functions 'SetExcMMU'
and 'ClearExcMMU' (V10)
Note that changes to the MSR of the interrupted task must be done
by writing to SRR1 (i.e. setting the trace bit).
Note that exception handlers should generally not call system
functions with some exceptions (for example 'SignalPPC' is often
useful to call from exception handlers). System functions must not
be called unless it's allowed explicitely by the documentation of
each function.
Note that the content of the program counter (SRR0) differs depending
on the exception type. Sometimes it contains the address of the
excepting instruction and sometimes the address of the next
instruction to complete. Exception handlers must take care about
this and should set the program counter appropriately.
Here follows a table of all supported exceptions and their behaviour:
Machine check (EXCF_MCHECK): PC -> maybe next instruction
Data access (EXCF_DACCESS): PC -> excepting instruction
Instruction access (EXCF_IACCESS): PC -> next instruction
Alignment (EXCF_ALIGN): PC -> excepting instruction
Program (EXCF_PROGRAM): PC -> excepting instruction
FP unavailable (EXCF_FPUN): PC -> excepting instruction
Trace (EXCF_TRACE): PC -> next instruction
Performance Monitor (EXCF_PERFMON): unknown
Instruction breakpoint (EXCF_IABR): PC -> excepting instruction
Exception handlers should not waste stack space. The system
allocates an extra space for this purpose but it may not be
sufficient if very stack-intensive routines are called as
exception handlers.
If every exception handler returns the state EXCRETURN_NORMAL
then the standard WarpOS exception handler is executed (except
for Trace- and PerformanceMonitor-Exceptions).
If exception handlers are written to emulate commands causing
an exception they should return EXCRETURN_ABORT as return value
to suppress following exception handlers which might output
some alert messages. The priority should be probably high enough
to ensure that no unwanted reactions occur.
The WarpOS debugging system is disabled during exception
processing.
It's completely ILLEGAL to exit an exception handler by an RFI
instruction!! It's also illegal to trash SPRG0!
SEE ALSO
RemExcHandler, powerpc/powerpc.i
powerpc.library/SetExcMMU powerpc.library/SetExcMMU
NAME
SetExcMMU - installs a BAT based MMU setup for exception handlers (V10)
CPU
PowerPC
SYNOPSIS
SetExcMMU(_PowerPCBase)
r3
void SetExcMMU(struct Library *);
FUNCTION
This function is for exception handlers only. It installs a new
temporary MMU setup which allows exception handlers to access critical
address space, such as custom chip space. Exception handlers are
normally run with MMU switched off to avoid problems on systems
without hardware tablesearch.
The new MMU setup is based on the BAT registers.
The function 'ClearExcMMU' restores the old MMU state and should
be called at the end of the exception handler.
INPUTS
_PowerPCBase - base of powerpc.library
NOTES
This function must not be called from anywhere else than from
an exception handler.
SEE ALSO
ClearExcMMU
powerpc.library/SetHardware powerpc.library/SetHardware
NAME
SetHardware - hardware manipulation function (V9)
CPU
PowerPC
SYNOPSIS
Status = SetHardware(_PowerPCBase, hardwareflags, parameter)
r3 r4 r5
ULONG SetHardware(struct Library *, ULONG, void *);
FUNCTION
This function offers some functions to access the PPC hardware.
INPUTS
_PowerPCBase - base of powerpc.library
hardwareflags - action to be performed:
HW_TRACEON: Enables trace mode for the current task
HW_TRACEOFF: Disables trace mode for the current task
HW_BRANCHTRACEON: Enables branch trace mode for the current task
HW_BRANCHTRACEOFF: Disables branch trace mode for the current task
HW_FPEXCON: Enables the floating point exceptions for the
current task
HW_FPEXCOFF: Disables the floating point exceptions for the
current task
HW_SETIBREAK: Sets the global instruction breakpoint
HW_CLEARIBREAK: Clears the global instruction breakpoint
HW_SETDBREAK: Sets the global data breakpoint
HW_CLEARDBREAK: Clears the global data breakpoint
parameter - additional parameter only used if a breakpoint should be
set. Then it contains the breakpoint address.
RESULT
Status - HW_AVAILABLE: The requested feature is available on this CPU
HW_NOTAVAILABLE: The requested feature is not available on
this CPU
NOTES
Floating point exceptions are only enabled globally with HW_FPEXCON.
It's necessary to call 'ModifyFPExc' to enable the desired floating
point exceptions.
Floating point exceptions should not be enabled by standard
applications. They are intended to use for debugging purposes.
The data breakpoint feature is not available on PPC603[E].
SEE ALSO
ModifyFPExc, powerpc/powerpc.i
powerpc.library/SetReplyPortPPC powerpc.library/SetReplyPortPPC
NAME
SetReplyPortPPC - exchanges the reply port of a message (V13)
CPU
PowerPC
SYNOPSIS
OldPort = SetReplyPortPPC(_PowerPCBase, Message, MsgPortPPC)
r3 r3 r4 r5
struct MsgPortPPC* SetReplyPortPPC(struct Library *,
struct Message *, struct MsgPortPPC *);
FUNCTION
This function exchanges the message port of a message. It
can be used for internal PPC messages and for InterCPU
messages.
INPUTS
_PowerPCBase - base of powerpc.library
Message - a pointer to the message affected
MsgPortPPC - a pointer to a PPC message port
RESULT
The old reply port, which was installed in the message.
Can be NULL, of course.
NOTES
It's possible to specify NULL as MsgPort to remove the
reply port.
Don't poke into the message structure at MN_REPLYPORT,
please use this function here.
SEE ALSO
WaitPortPPC, GetMsgPPC, ReplyMsgPPC, PutMsgPPC, powerpc/portsPPC.i
powerpc.library/SetSignalPPC powerpc.library/SetSignalPPC
NAME
SetSignalPPC - define the state of this task's signals (V8)
CPU
PowerPC
SYNOPSIS
oldSignals = SetSignalPPC(_PowerPCBase, newSignals, signalMask)
r3 r3 r4 r5
ULONG SetSignalPPC(struct Library *, ULONG, ULONG);
FUNCTION
This function can query or modify the state of the current
signals. This function is the mirror function of exec/SetSignal.
INPUTS
_PowerPCBase - base of powerpc.library
newSignals - the new values for the signals
signalMask - the set of signals to be affected.
RESULT
oldSignals - the prior values for all signals
NOTES
It's possible to check for the system signals (i.e. CTRL_C).
Before V11, this only worked if the task was stated using
RunPPC, this is not the case anymore.
SEE ALSO
AllocSignalPPC, FreeSignalPPC, SignalPPC, WaitPPC
powerpc.library/SetTaskPriPPC powerpc.library/SetTaskPriPPC
NAME
SetTaskPriPPC - get and set the priority of a task (V8)
CPU
PowerPC
SYNOPSIS
oldpriority = SetTaskPriPPC(_PowerPCBase, taskPPC, priority)
r3 r3 r4 r5
LONG SetTaskPriPPC(struct Library *, struct TaskPPC *, LONG);
FUNCTION
This function changes the priority of a task regardless of its
state. The old priority of the task is returned. A reschedule
may be performed. This is the mirror function of exec/SetTaskPri.
INPUTS
_PowerPCBase - base of powerpc.library
taskPPC - task to be affected
priority - the new priority for the task
RESULT
old priority - the tasks previous priority
powerpc.library/Signal68K powerpc.library/Signal68K
NAME
SignalPPC - signal a 68K task (V8)
CPU
PowerPC
SYNOPSIS
Signal68K(_PowerPCBase, task, signals)
r3 r4 r5
void Signal68K(struct Library *, struct Task*, ULONG);
FUNCTION
This function signals a 68K task with the given signals. If
the signalled task is sleeping, it's woken up and a reschedule
may occur.
INPUTS
_PowerPCBase - base of powerpc.library
task - the 68K task to be signalled
signals - the signals to be sent
powerpc.library/SignalPPC powerpc.library/SignalPPC
NAME
SignalPPC - signal a task (V8)
CPU
PowerPC
SYNOPSIS
SignalPPC(_PowerPCBase, taskPPC, signals)
r3 r4 r5
void SignalPPC(struct Library *, struct TaskPPC*, ULONG);
FUNCTION
This function signals a task with the given signals. If the
signalled task is sleeping, it's woken up and a reschedule
may occur. This is the mirror function of exec/Signal.
INPUTS
_PowerPCBase - base of powerpc.library
taskPPC - the task to be signalled
signals - the signals to be sent
NOTES
This function is safe to call from exception handlers.
Since V11 it's possible to signal a 68K task directly
with 'SignalPPC' and the 68K task structure in r4.
Before V11, 'SignalPPC' only worked, if the PPC task
had a mirror 68K task. Since V11, every PPC task has
a mirror task, so 'SignalPPC' can always be used.
Furthermore, all signals, which are sent to a task currently
waiting for its mirror task to complete, are transferred
automatically to the mirror task. In fact, the whole signal
system is shared and can be viewed as one single 'virtual
signaling system'. It really doesn't matter, on which CPU
a program is running, the signals are always transferred to
the currently active part.
SEE ALSO
AllocSignalPPC, FreeSignalPPC, SetSignalPPC, WaitPPC
powerpc.library/SnoopTask powerpc.library/SnoopTask
NAME
SnoopTask - monitors beginning or end of a PPC task (V13)
CPU
PowerPC
SYNOPSIS
SnoopID = SnoopTask (_PowerPCBase, SnoopTags)
r3 r3 r4
ULONG SnoopTask (struct Library *, struct TagItem *);
FUNCTION
This function allows to intall a callback job, which is executed
when a new PPC task is started or when a PPC task is removed.
This is useful for debuggers which want to be kept informed
about new tasks installed into the system and about tasks removed
from the system.
The callback function has two different formats (prototypes),
dependant on the type of callback:
1. callback function for monitoring the beginning of a PPC task
(SNOOP_TYPE = TASK_START)
SYNOPSIS:
CallbackFunction (PPCTask, EntryCode, CreatorTask, CreatorCPU)
r3 r4 r5 r6
void CallbackFunction (struct TaskPPC *, APTR, struct Task *, ULONG);
INPUTS:
PPCTask - pointer to the new PPC task which is created
EntryCode - pointer to the start code, which will be executed
by the new task
CreatorTask - pointer to the task structure of the task, which
created the new PPC task. If the new task is created
due to a call of RunPPC from 68K side, then the
CreatorTask points to the 68K-Task-Structure. If
the PPC task was created by directly calling
'CreateTaskPPC', CreatorTask points to this PPC task.
CreatorCPU - One of two possible values:
CREATOR_PPC : The new PPC task was created using
'CreateTaskPPC' by a PPC task.
CREATOR_68K : The new PPC task was created using
'RunPPC' by a 68K task.
2. callback function for monitoring the end of a PPC task
(SNOOP_TYPE = TASK_EXIT)
SYNOPSIS:
CallbackFunction (PPCTask)
r3
void CallbackFunction (struct TaskPPC *);
INPUTS:
PPCTask - pointer to the PPC task which is removed. NEVER use
FindTaskPPC(NULL), because it's possible that a PPC
task is removed by another PPC task!
INPUTS
_PowerPCBase - base of powerpc.library
TagItems - pointer to a tagitem array. The following tags are
supported:
SNOOP_CODE: pointer to the callback function which should
be called, if a new PPC task is created or
if a PPC task is removed.
SNOOP_DATA: custom data which passed in register r2.
this will usually be the smalldata base of
the task which wants to snoop other tasks
to gain access to more data space.
SNOOP_TYPE: two possible values:
SNOOP_START : The callback function is called
when a new PPC task is created
SNOOP_EXIT : The callback function is called
when a PPC task is removed
RESULT
SnoopID - An ID, which must be passed to EndSnoopTask, as soon as the
snooping action should be terminated. NULL, if an error
occurs.
SEE ALSO
EndSnoopTask
powerpc.library/SPrintF powerpc.library/SPrintF
NAME
SPrintF - prints a formatted string to the serial port (V7)
CPU
PowerPC
SYNOPSIS
SPrintF (_PowerPCBase, Formatstring, values )
r3 r4 r5
void SPrintF (struct Library *, STRPTR, APTR);
FUNCTION
Prints a formatted string to the serial port using the AMIGA-OS
functions 'exec/RawPutChar' and 'exec/RawDoFmt'. Can be used to add
debugging features and to improve the maintenance of software.
INPUTS
_PowerPCBase - base of powerpc.library
Formatstring - A C style string with % commands to indicate where
parameters have to be inserted (see 'exec/RawDoFmt'
for a detailed description of these commands).
values - A pointer to an array of parameters to be inserted into
specified places in the string.
SEE ALSO
exec/RawDoFmt
powerpc.library/SubTimePPC powerpc.library/SubTimePPC
NAME
SubTimePPC - subtracts one time request from another (V7)
CPU
PowerPC
SYNOPSIS
SubTimePPC(_PowerPCBase, Dest, Source)
r3 r4 r5
void SubTimePPC(struct Library *, struct timeval *, struct timeval *);
FUNCTION
This routine subtracts one timeval structure from another. The results
are stored in the destination (Dest - Source -> Dest)
This is the mirror function of timer/SubTime.
INPUTS
_PowerPCBase - base of powerpc.library
Dest - pointer to a timeval structure
Source - pointer to a timeval structure
NOTES
This function is safe to call from exception handlers
SEE ALSO
GetSysTimePPC, AddTimePPC, CmpTimePPC
powerpc.library/Super powerpc.library/Super
NAME
Super - switch to supervisor mode (V9)
CPU
PowerPC
SYNOPSIS
SuperKey = Super(_PowerPCBase)
r3 r3
ULONG Super(struct Library *);
FUNCTION
This function changes the current task to supervisor mode.
INPUTS
_PowerPCBase - base of powerpc.library
RESULT
SuperKey - A key value which must be passed to 'User' to switch back
to user mode
NOTES
Applications should generally not enter supervisor mode. Check first
if there exists a library function which gives you access to the
supervisor resources required.
SEE ALSO
User
powerpc.library/UnLockTaskList powerpc.library/UnLockTaskList
NAME
UnLockTaskList - unlocks a list locked by LockTaskList (V10)
CPU
PowerPC
SYNOPSIS
UnLockTaskList(_PowerPCBase)
r3
void UnLockTaskList(struct Library *);
FUNCTION
Unlocks the task list which was locked by LockTaskList
INPUTS
_PowerPCBase - base of powerpc.library
SEE ALSO
LockTaskList, powerpc/tasksppc.i
powerpc.library/User powerpc.library/User
NAME
User - switch to user mode (V9)
CPU
PowerPC
SYNOPSIS
User(_PowerPCBase, SuperKey)
r3 r4
void User(struct Library *, ULONG);
FUNCTION
This function changes the current task to user mode.
INPUTS
_PowerPCBase - base of powerpc.library
SuperKey - The return value of the matching call of 'Super'
SEE ALSO
Super
powerpc.library/WaitFor68K powerpc.library/WaitFor68K
NAME
WaitFor68K - waits for the completion of an asynchrone 68K call (V7)
CPU
PowerPC
SYNOPSIS
status = WaitFor68K(_PowerPCBase, PPStruct )
r3 r3 r4
LONG WaitFor68K (struct Library *, struct PowerPC *);
FUNCTION
After an asynchrone 68K call was done (see Run68K) this function must
be called to wait for the completion of the 68K function. All
registers transferred to the PowerPC with Run68K are returned into the
PowerPC Structure.
INPUTS
_PowerPCBase - base of powerpc.library
PPStruct - Pointer to a PowerPC Structure (see Run68K for a description
of the elements). The structure has not to be initialized.
The structure must be transferred to hold the returned
registers by the 68K function.
RESULT
status - PPERR_SUCCESS if the call was successfully
PPERR_WAITERR if WaitFor68K is called after a synchrone 68K
call.
NOTES
Assembler programmers should use the macros WAITFOR68K and
WAITFOR68K_XL located in the include file 'powerpc/powerpc.i'
SEE ALSO
Run68K,powerpc/powerpc.i
powerpc.library/WaitPortPPC powerpc.library/WaitPortPPC
NAME
WaitPortPPC - wait for a given port to be non-empty (V11)
CPU
PowerPC
SYNOPSIS
message = WaitPortPPC(_PowerPCBase, MsgPortPPC)
r3 r3 r4
struct Message *WaitPortPPC(struct Library *, struct MsgPortPPC *);
FUNCTION
This function waits until the given port becomes non-empty. The
first message in the port is returned without removing it from
the port. This is the mirror function of exec/WaitPort.
INPUTS
_PowerPCBase - base of powerpc.library
port - a pointer to a message port
RESULTS
message - a pointer to the first available message
SEE ALSO
PutMsgPPC, GetMsgPPC, ReplyMsgPPC, powerpc/portsPPC.i
powerpc.library/WaitPPC powerpc.library/WaitPPC
NAME
WaitPPC - wait for one or more signals (V8)
CPU
PowerPC
SYNOPSIS
signals = WaitPPC(_PowerPCBase, signalSet)
r3 r3 r4
ULONG WaitPPC(struct Library *, ULONG);
FUNCTION
This function attempts to wait for the given signals. If at
least one of these signal is already set, the task returns
immediately, otherwise it changes to waiting state. This is
the mirror function of exec/Wait.
INPUTS
_PowerPCBase - base of powerpc.library
signalSet - the set of signals for which to wait
RESULTS
signals - the signals which were received
NOTES
Since V11 it's possible to wait for signals which might
be sent by 68K tasks (and maybe only to the mirror 68K
task of this PPC task here). Calling exec/Signal with a
PPC task structure as first argument will work, too.
See the desription of 'SignalPPC' for more information
about the shared signaling system.
SEE ALSO
AllocSignalPPC, FreeSignalPPC, SetSignalPPC, SignalPPC
powerpc.library/WaitTime powerpc.library/WaitTime
NAME
WaitTime - wait for a given time or for given signals (V10)
CPU
PowerPC
SYNOPSIS
signals = WaitTime(_PowerPCBase, signalSet, time)
r3 r3 r4 r5
ULONG WaitTime(struct Library *, ULONG, ULONG);
FUNCTION
This function attempts to wait for a specific time of for
given signals. This function acts just like 'WaitPPC' with
the difference that the task returns when the time specified
is over.
INPUTS
_PowerPCBase - base of powerpc.library
signalSet - the set of signals for which to wait (can be 0
if the task should only wait for a given time)
time - the time in microseconds to wait
RESULTS
signals - the signals which were received (if this value is 0,
then the time is up).
NOTES
The time which explicitly passes between calling 'WaitTime' and
returning from it can vary dependant of current system state. If
many tasks are active, the time can be delayed. Furthermore the
overhead of this function must be taken in account.
SEE ALSO
WaitPPC